W tym projekcie po czyszczeniu zbioru danych oraz konwertowaniu poszczególnych zmiennych do właściwego dla nas typu zajmiemy się badaniem zależności pomiędzy pewnymi typami zmiennych za pomocą np. wyznaczenia korelacji pomiędzy zmiennymi numerycznymi. Znajdziemy też średnie opóźnień dla poszczególnych przewoźników lub relacji, uwzględnimy dane pogodowe, żeby wyłapać tę zależność oraz wesprzymy nasze wnioski odpowiednimi wizualicjami. Pomysłem też jest zrobienie liniowego modelu predykcyjnego, który na podstawie danych pogodowych będzie przewidywał średnie opóźnienie na poszczególnych stacji
Cele
Celem projektu jest zbadać częstotliwość oraz skalę opóźnień pociągów w danym okresie oraz zależność ich od sytuacji meteorologicznej. Przedstawić tę zależność za pomocą wizualizacji. Zwizualizować też inne zależności w danych
Hipotezy
Przed badaniem robimy przypuszczenie, iż gorsza sytuacja pogodowa powoduje większe i częstsze opóźnienia
Opis: The dataset contains information about delays on polish railroads published by the Polish State Railways in real time. Data was scraped from https://infopasazer.intercity.pl. It covers the period from the midnight of 2022-05-16 until the midnight of 2022-05-30. Observations were collected every 5 minutes.
Zmienne wyglądają w taki sposób po drobnych zmianach:
datetime - czas w którym dane zostały zeskrapowane
id - numer pociągu
carrier - przewoźnik
start - stacja początkowa
end - stacja końcowa
delay - current estimated delay
name - train station name
Dataset został opublikowany w roku 2022 i do teraz ma nie więcej niż 800 pobrań. Nie znalazłem również żadnych raportów z wykorzystaniem tego zbioru, więc można stwierdzić, że zbiór jest dość unikatowy.
Z drugiej strony, zbiór liczy około 4 mln obserwacji, więc jest dla nas dość reprezentatywne.
Opis: Są to archiwowe dane pogodowe dla okresu, odpowiadającego okresu zbierania danych w pierwszym zbiorze. Za lokalizaję wzięto przybliżone koordynaty geograficznego centrum Polski.
Przygotowanie zbiorów danych
Z powodu tego, że zbiór 1 liczy prawie 4 mln obserwacji, wybranie prób reprezentatywnych oraz łączenie w jedyny zbiór znalazły się w oddzielnym pliku. Oto prykładowo są pierwsze 5 wierszy złączonego datasetu:
Na zaskoczenie korelacja pomiędzy zmienną delay a zmiennymi pogodowymi okazała się bardzo bliska zeru, z czego robimy wniosek, że w ten sposób nie ujawnimy zależności o ile one istnieją
Model regresji logistycznej
Model ten jest przydatny do przeprowadzenia przewidywania zmiennej typu logicznego na podstawie wartości predyktorów. Naszą zmienną którą będziemy chcieli przewidywać będzie is_late. Model będziemy uczyć na zbiorze testowym na podstawie predyktorów rain, wind_speed oraz temperature. Jako wynik model będzie zwracał prawdopodobieństwo tego, że w danym przypadku wystąpi opóźnienie (delay > 5), czyli że is_late = TRUE
Confusion Matrix and Statistics
Reference
Prediction TRUE FALSE
TRUE 88 5388
FALSE 1336 54013
Accuracy : 0.8895
95% CI : (0.8869, 0.8919)
No Information Rate : 0.9766
P-Value [Acc > NIR] : 1
Kappa : -0.0121
Mcnemar's Test P-Value : <2e-16
Sensitivity : 0.061798
Specificity : 0.909294
Pos Pred Value : 0.016070
Neg Pred Value : 0.975862
Prevalence : 0.023411
Detection Rate : 0.001447
Detection Prevalence : 0.090029
Balanced Accuracy : 0.485546
'Positive' Class : TRUE
Widzimy, że model nie ma mocy przewidywania, ponieważ p-value jest równe 1 oraz na przykładzie danych testowych możemy się upewnić, że model nie jest skuteczny w przewidywaniu naszej zmiennej. Stało się tak dlatego, że w naszych danych nie występuje wystarczającej dla nas zależności zmiennej którą przewidujemy od predyktorów a więc nie możemy sądzić o tej zmiennej na podstawie innych
Wizualizacje
Dane meteorologiczne
Aby zilustrować jaką sytuację mamy co do zależności opóźnienia, zwizualizujmy jakie opóźnienia były przy różnych ilościach opadów
Kod
ggplot(df)+geom_point(aes(y = delay, x = rain), colour ="darkorange")+xlab("Opady (mm)")+ylab("Opóźnienie (min)")+theme_minimal()
Nie jest to dziwne więc że korelacja była taka mała a model regresji okazał się nie efektywny. Widzimy z wykresu, że w naszych danych nie ma odpowiedniości: duże jak i małe opóźnienia można spotkać przy dużych, jak i przy małych opadach.
Widzimy, że każdy przewoźnik ma trend do tego, że tych większych opóźnień ma mniej niż mniejszych, przy czym znacznie więcej relacji wykonał z opóźnieniem <5 min, jednak warto zauważyć, że na przykład PKP IC ma tą różnicę najmniej widoczną
Kod
df$day =as.POSIXlt(df$datetime)$mdayavg_by_day_carr = df%>%group_by(day, carrier) %>%summarise(avg =mean(delay))avg_by_day_carr %>%ggplot(aes(x =factor(day), fill = carrier, y = avg)) +geom_bar(position ='dodge', stat ="identity") +theme_minimal() +ylab("Średnie opóźnienie (min)") +xlab("Dzień maja 2022")+guides(fill =guide_legend(ncol =1))+ggtitle("Rozkład opóźnień u przewoźników każdego dnia")+theme(plot.title =element_text(hjust =0.5, face ="bold"), legend.position ="right", legend.text =element_text(size =6), legend.title =element_blank(), legend.key.width =unit(0.5, "line"), legend.margin =margin())
Widzimy, że w każdym dniu (za wyjątkiem 16 i 19) najbardziej się spóźniał PKP IC. Natomiast Koleje Dolnośląskie Mazowieckie i Śląskie w kulku dniach nie za bardzo odstawały od PKP IC. Prawdopodobnie związane to jest z tym, że przewoźnicy ci działają w obrębie olbrzymich miast i metropolii: Warszawy, Wrocławia i Górnośląsko-Zagłębiowskiej Metropolii, mających skomplikowany system kolejowy, wraźliwy na zakłócenia ruchu.
Ciekawą obserwacją jest to, że niektóre przewoźniki, takie jak SKM w Trójmieście, KŚ lub KM mają znaczną część obserwacji z opóźnieniami bliskimi do zera, czyli w pewnym momencie następuje pewny skok tych wartości, wówczas u innych liczba obserwacji z większymi opóźnieniami zmienia się raczej w sposób ciągły bez nagłych skoków. Można zrobić przypuszczenie, że te pierwsze przewoźniki mają albo bardzo niskie, albo raczej wysokie opóźnienie przez to, że na ich działanie mają wpływ w większości przypadków czynniki występujące rzadko, takie jak np wypadki, awaria sieci trakcyjnej lub taboru, wówczas gdy ta druga grupa raczej zależy od częstych i mniej znaczących czynników takich jak np zakłócenia w ruchu lub oczekiwanie na inny pociąg
Kod
most_freq_del = df %>%group_by(id) %>%summarise(Delayed =sum(delay>10), carrier = carrier[1], Relacja =paste0(as.character(start[1]), " - ", as.character(end[1]))) %>%arrange(desc(Delayed))%>%slice(1:20)plot_naj =ggplot(most_freq_del, aes(y =reorder(id, -sort(Delayed)), x = Delayed, fill = Delayed, label = Relacja))+geom_bar(stat ="identity")+xlab("")+ylab("")+ggtitle("Relacje z największą liczbą opóźnionych kursów")+theme_minimal()+scale_fill_gradient(low ="lightpink", high ="purple")+theme(plot.title =element_text(hjust =0.5, face ="bold"), legend.position ="none", legend.text =element_text(size =7.5, face ="bold"), legend.title =element_blank(), legend.key.height =unit(1, "line"), legend.key.width =unit(0.3, "line"), legend.margin =margin(), legend.byrow =TRUE) ggplotly(plot_naj, tooltip =c("label", "fill"))
Mapa Polski
Pokażmy jak opóźnienia zależały od tego, skąd przybył pociąg. Do tego celu wziąłem sobie wszystkie unikalne wartości z kolumny start i za pomocą narzędzia ChatGPT otzymałem listę województw w których znajdują się te stacje. Po złączeniu tej listy z naszą wyjściową ramką danych wybieramy sobie kilka cech które chcemy zwizualizować
Widzimy, że najwięcej istotnych opóźnień pojawia się w relacjach które przybywają z województw granicznych naszego kraju. Ma to sens, gdyż pociągi te mogą czekać na często spóźnione pociągi jadące zza granicy z takich krajów, jak Niemcy, Czechy czy Ukraina
Kod
leaderinwoj_map =merge(poland_void, leaderinwoj, by.x ="shapeName", by.y ="region")leaderinwoj_map %>%ggplot(aes(fill=carrier)) +geom_sf(show.legend =c(alpha=F), color ="white") +labs(fill="") +theme_minimal() +theme(plot.title =element_text(hjust =0.5, face ="bold"))+ggtitle("Przewoźnik z największą średnią opóźnień")
Okazało się, że PKP IC jest leaderem w każdym wojewodztwie oprócz Świętokrzyskiego, w tym ostatnim z kolei najbardziej się spóźniały Koleje Mazowieckie. Może to być spowodowane tym, że PKP IC jest największym przewoźnikiem kolejowym w Polsce, jego relacje są dłuższe a więc bardziej są poddane czynnikom sprzyjającym opóźnieniom
Kod
lublin_dir_map =merge(poland_void, lublin_dir, by.x ="shapeName", by.y ="region")lublin_dir_map %>%ggplot(aes(fill=delaysum))+geom_sf(show.legend =c(alpha=F), color ="black") +labs(fill="min") +theme_minimal() +theme(plot.title =element_text(hjust =0.5, face ="bold"))+scale_fill_gradient(low ="lightblue", high ="darkblue") +ggtitle("Skąd najwięcej spóźnień do Lublina")
Wnioski
Wnioski z przeprowadzonej analizy wskazują, że choć początkowo zakładałem istnienie wyraźnej zależności pomiędzy opóźnieniami pociągów a warunkami pogodowymi, wyniki analizy korelacji nie ujawniają istotnej zależności pomiędzy tymi zmiennymi. Korelacja pomiędzy opóźnieniami a zmiennymi meteorologicznymi, okazała się bliska zeru. Oznacza to, że warunki pogodowe nie są głównym czynnikiem wpływającym na opóźnienia pociągów w tym okresie. Z kolei wizualizacje ujawniły ciekawe zależności, które da się wyjaśnić już po zaobserwowaniu a których nie oczekiwałem początkowo znaleźć, takich jak na przykład zwiększone opóźnienia u pociągów z granicznych regionów oraz rozkład opóźnień u poszczególnych przewoźników